package com.bjb.vr.common.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjb.vr.common.ao.ResLocalAo;
import com.bjb.vr.common.constant.ThreadLocalConstant;
import com.bjb.vr.common.dto.*;
import com.bjb.vr.common.mapper.ResFavoritesMapper;
import com.bjb.vr.common.mapper.ResLocalResourceMapper;
import com.bjb.vr.common.utils.DateTimeUtil;
import com.bjb.vr.common.utils.ThreadLocalUtil;
import com.bjb.vr.common.vo.ResLocalVo;
import com.bjb.vr.common.vo.UmsAccountVo;
import com.github.yitter.idgen.YitIdHelper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @author admin
 * @description 针对表【res_local_resource】的数据库操作Service实现
 * @createDate 2022-03-22 15:54:55
 */
@Service
public class ResLocalResourceService extends ServiceImpl<ResLocalResourceMapper, ResLocalResource> {

    @Autowired
    private ResLocalResourceMapper localResourceMapper;

    @Autowired
    private ResFavoritesMapper favoritesMapper;

    @Resource
    FileOperationService fileOperationService;

    /**
     * 查询本地资源（等于设备资源）
     *
     * @param resLocalAo
     * @return
     */
    public IPage<ResLocalVo> getLocalResources(ResLocalAo resLocalAo) {
        SysPlatform sysPlatform = (SysPlatform) ThreadLocalUtil.get(ThreadLocalConstant.USER_PLATFORM_INFO);
        UmsAccountVo umsAccountVo = (UmsAccountVo) ThreadLocalUtil.get(ThreadLocalConstant.USER_ACCOUNT_INFO);
        // 构造查询条件
        MPJLambdaWrapper<ResLocalVo> joinQueryWrapper = new MPJLambdaWrapper<>();
        joinQueryWrapper.selectAll(ResLocalResource.class)
                .select(ResPlatformResource::getPreImagePath)
                .select(ResContentAuthority::getContValidStartDate)
                .select(ResContentAuthority::getContValidEndDate)
                .selectAs(ResLocalResource::getContentSize, "capacity")
                .innerJoin(ResPlatformResource.class, ResPlatformResource::getResId, ResLocalResource::getResId)
                .innerJoin(ResContentAuthority.class, on -> on.eq(ResContentAuthority::getContentId, ResLocalResource::getResId)
                        .eq(ResContentAuthority::getTenantId, umsAccountVo.getTenantId()));
        // 查询条件
        joinQueryWrapper.eq(Objects.nonNull(sysPlatform.getPlatformCode()), ResLocalResource::getThemeCode, sysPlatform.getPlatformCode());
        joinQueryWrapper.in(Objects.nonNull(resLocalAo.getIds()), ResLocalResource::getId, resLocalAo.getIds());
        joinQueryWrapper.eq(Objects.nonNull(resLocalAo.getPeriod()), ResLocalResource::getPeriod, resLocalAo.getPeriod());
        joinQueryWrapper.eq(Objects.nonNull(resLocalAo.getLevel()), ResLocalResource::getLevel, resLocalAo.getLevel());
        joinQueryWrapper.eq(Objects.nonNull(resLocalAo.getSubject()), ResLocalResource::getSubject, resLocalAo.getSubject());
        joinQueryWrapper.eq(Objects.nonNull(resLocalAo.getResType()), ResLocalResource::getResType, resLocalAo.getResType());
        joinQueryWrapper.like(StringUtils.isNotBlank(resLocalAo.getResName()), ResLocalResource::getResName, resLocalAo.getResName());
        joinQueryWrapper.groupBy(ResLocalResource::getId);
        // 执行查询
        IPage<ResLocalVo> joinPage = localResourceMapper.selectJoinPage(new Page<>(resLocalAo.getCurrent(), resLocalAo.getSize()), ResLocalVo.class, joinQueryWrapper);
        buildNeedInfo(joinPage.getRecords());
        return joinPage;
    }

    /**
     * 构建需要的信息
     *
     * @param resLocalVos
     * @return
     */
    private void buildNeedInfo(List<ResLocalVo> resLocalVos) {
        resLocalVos.forEach(resLocalVo -> {
            try {
                UmsAccountVo umsAccountVo = (UmsAccountVo) ThreadLocalUtil.get(ThreadLocalConstant.USER_ACCOUNT_INFO);
                ResFavorites favorites = favoritesMapper.selectByCondition(umsAccountVo.getUserId(), resLocalVo.getResId());
                if (Objects.isNull(favorites)) {
                    resLocalVo.setIsFavorites(false);
                } else {
                    resLocalVo.setIsFavorites(true);
                }
                // 设置内容是否有效
                LocalDate nowDate = DateTimeUtil.getLocalDate(new Date());
                if (resLocalVo.getContValidStartDate() == null) {
                    resLocalVo.setContentValidState(2);
                } else if (resLocalVo.getContValidEndDate() == null) {
                    if (nowDate.compareTo(resLocalVo.getContValidStartDate()) >= 0) {
                        resLocalVo.setContentValidState(1);
                    } else {
                        resLocalVo.setContentValidState(2);
                    }
                } else {
                    if (nowDate.compareTo(resLocalVo.getContValidStartDate()) >= 0 && nowDate.compareTo(resLocalVo.getContValidEndDate()) <= 0) {
                        resLocalVo.setContentValidState(1);
                    } else {
                        resLocalVo.setContentValidState(2);
                    }
                }
                // 设置字典值
                if (StringUtils.isNotBlank(resLocalVo.getPreImagePath())) {
                    resLocalVo.setPreImagePath(fileOperationService.downloadFile(resLocalVo.getPreImagePath()));
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }


    /**
     * 删除本地资源表数据
     *
     * @param tenantId
     * @param bundleId
     */
    public void deleteLocalResourceByBundleId(String tenantId, Long bundleId) {
        localResourceMapper.deleteLocalResourceByBundleId(tenantId, bundleId);
    }

//    /**
//     * 添加本地资源表数据
//     *
//     * @param tenantId
//     * @param bundleId
//     */
//    public void addLocalResourceByBundleId(String tenantId, Long bundleId) {
//        localResourceMapper.addLocalResourceByBundleId(tenantId, bundleId);
//    }

    /**
     * 添加本地资源表数据
     *
     * @param tenantId
     * @param bundleId
     */
    public void addLocalResourceByProdBundleId(String tenantId, Long bundleId) {
        List<ResLocalResource>  resLocalResourceList = localResourceMapper.queryLocalResourceByProdBundleId(tenantId,bundleId);
        buildNeedInfo(tenantId,resLocalResourceList);
        this.saveBatch(resLocalResourceList);
    }

    public void buildNeedInfo(String tenantId, List<ResLocalResource> resLocalResourceList){
        if(resLocalResourceList!=null && resLocalResourceList.size()>0){
            resLocalResourceList.forEach(
                    resLocalResource -> {
                        resLocalResource.setDataId(YitIdHelper.nextId());
                        resLocalResource.setTenantId(tenantId);
                        resLocalResource.setGmtCreate(DateTimeUtil.getLocalDateTime(new Date()));
                    }
            );
        }
    }
}




